package enumdemo;

// 枚举的创建：
// 右键--选择Enum-- 再输入类名即可
// 注意创建的枚举是enum，而不是class

public enum TestEnum {
    // 可以直接写要枚举的对象
    //RED,BLACK,GREEN; // 枚举对象

    RED,BLACK("purple",6),GREEN,WHITE; // 注意：枚举对象直接写在类里
    // 注意这些都是对象（调用的是构造方法，因为此时有两个构造方法，所以：两种对象形式都ok）

    // 枚举类的构造方法：
    // 重要：枚举的构造方法默认是私有的，不能加public、protected的修饰，只能加private或者不加默认private！！
    public String color;
    public int ordinal;
    TestEnum(String color,int ordinal) {
        this.color = color;
        this.ordinal = ordinal;
    }

    // 此时如果想要无参构造方法，就需要显式的写出
    TestEnum() {

    }

    // 使用Enum的常用方法：
    public static void main(String[] args) {
        //compareTo进行大小比较：返回的是：正数、0、负数
        // 注意比较的所处的位置：也就是坐标相减的值！
        // 注意拿到枚举实例：类名.枚举对象

        //拿到枚举实例BLACK
        TestEnum testEnum = TestEnum.BLACK;
        //拿到枚举实例RED
        TestEnum testEnum21 = TestEnum.RED;
        System.out.println(testEnum.compareTo(testEnum21));
        System.out.println(GREEN.compareTo(RED));
        System.out.println(RED.compareTo(BLACK));
    }

    public static void main2(String[] args) {
        TestEnum[] testEnum = TestEnum.values(); // 注意此处:类型数组+类调用方法
        for (int i = 0; i < testEnum.length; i++) {
            System.out.println(testEnum[i] + "序号：" + testEnum[i].ordinal());
        }
        System.out.println("===");
        // 字符串转枚举类型
        // 但是注意：字符串的参数类型要与之前的枚举类型匹配（如：WHITE2这样子就是不行的，会报异常）
        TestEnum testEnum1 = TestEnum.valueOf("WHITE");
        System.out.println(testEnum1);
    }


    // 应用1：枚举在switch case语句中使用（创建对象，直接用类进行枚举对象调用）
    public static void main1(String[] args) {
        TestEnum testEnum2 = TestEnum.BLACK;  // 直接通过类名调用枚举对象！!
        switch (testEnum2) {
            case RED:
                System.out.println("red");
                break;
            case BLACK:
                System.out.println("black");
                break;
            case WHITE:
                System.out.println("WHITE");
                break;
            case GREEN:
                System.out.println("green");
                break;
            default:
                break;
        }
    }
}
